//
//  "$Id: VideoDec.h 91860 2012-12-08 09:18:30Z li_weijun $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __VIDEO_DEC_API_H__
#define __VIDEO_DEC_API_H__

#include "Types.h"
#include "VideoEnc.h"

#ifdef __cplusplus
extern "C" {
#endif

/// \defgroup VideoDecAPI API Video Decoder
/// 视频解码接口
///	\n 调用流程图:
/// \code
///    ============================================
///                   |                            
///            createVideoDecoder                      
///                   |
///                 addRef
///                   |                            
///              getChipCaps
///                   |
///                getCaps
///                   |
///                 start
///         +---------|---------------+
///         |     putFrame            |
///         |      getSize			flush
///         |         |               |
///         +---------|---------------+
///                 stop
///                   |         
///                release                       
///                   |                            
///    ============================================
/// \endcode
/// @{

/// 解码芯片解码能力结构，128字节
typedef struct VideoDecChipCaps
{
	ulong ladenBitrate;		///< 编码芯片支持的最高视频负载码流kbps(解压后,按16bpp计算)
	int reserved[31];		///< 保留
}VideoDecChipsCaps;


/// 解码器解码能力结构，128字节
typedef struct VideoDecCaps
{
	int reserved[32];		///< 保留
}VideoDecCaps;


/// 解码的压缩数据帧结构，128字节
typedef struct VideoDecPacket
{
	uchar * buffer;		///< 待写入的帧数据缓冲指针，视频帧和图片帧都包括大华帧头，多个帧不能拼在一起。
	ulong	length;		///< 待写入的帧数据长度。
	uint64	pts;		///< 时间戳，毫秒为单位
	ulong	sequence;	///< 包序号，用于校验是否丢包
	char	head;		///< 是否包含帧头，1-包含，0-不包含
	char	tail;		///< 是否包含帧尾，1-包含，0-不包含
	int reserved[26];	///< 保留
}VideoDecPacket;

enum VideoEncType;

/// 视频解码格式，128字节
typedef struct VideoDecFormat
{
	VideoEncType type : 8;	///< 视频编码的类型
	int reserved[31];		///< 保留
} VideoDecFormat;


/// 视频解码抓图结构，128字节
typedef struct VideoDecSnapshotParam
{
	int width;			///< [in,out]抓图像素宽度，16的倍数,大于64 
	int height;			///< [in,out]抓图像素高度，16的倍数,大于64 
	char quality;		///< [in,out]图像质量，取值1-6，值越大，图像质量越好
	uchar *buffer;		///< [out]指向完整的BMP或者JPEG文件格式数据
	ulong length;		///< [in,out]输入时表示长度上限，0表示不设上限；输出时表示实际抓图数据缓冲有效长度。
	int reserved[27];	///< 保留
} VideoDecSnapshotParam;


/// 数据类型
typedef enum
{
	videoDecJpeg,		///< JPEG
	videoDecBgr,		///< Bgr888
	videoDecArgb8888,	///< Argb8888
} VideoDecType;


/// 图像数据格式转换接口
typedef struct VideoDecTransParam
{
	int inType;		///< 输入数据格式, 定义见VideoDecType
	char *jpegData;	///< jpeg数据缓存
	int jpegLen;	///< jpeg数据长度

	int cropX;		///< 抠图x坐标 左上角为参考原点，参考系为图片真实长宽。
	int cropY;		///< 抠图y坐标
	int cropWidth;	///< 抠图宽
	int cropHeight;	///< 抠图高

	int dstWidth;	 ///< 目的图片宽
	int dstHeight;	 ///< 目的图片高

	int outType;	///< 输出数据格式
	char *rbgData;	///< rgb数据缓存, 定义见VideoDecType，使用着分配内存。
	int rgbLen;		///< rgb数据长度

	int revert[52];
} VideoDecTransParam;

/// 视频解码接口，512字节
typedef struct VideoDecoder
{
	/// 底层私有数据
	void *priv;


	/// 增加接口引用
	int (*addRef)(struct VideoDecoder *thiz);


	/// 释放接口
	int (*release)(struct VideoDecoder *thiz);


	/// 得到接码器所在的芯片ID
	///
	/// \param [in] thiz 视频解码接口指针
	/// \retval >=0 芯片ID
	/// \retval < 获取失败
	int (*getChipId)(struct VideoDecoder *thiz);


	/// 得到视频解码支持的特性。
	/// 
	/// \param [in] thiz 视频解码接口指针
	/// \param [out] caps 指向视频解码特性结构VideoDecChipCaps的指针。
	/// \retval 0  获取成功。
	/// \retval <0  获取失败。
	int (*getChipCaps)(struct VideoDecoder *thiz, struct VideoDecChipCaps * caps);


	/// 得到视频解码设备能力
	/// 
	/// \param [in] thiz 视频解码接口指针
	/// \retval 0 销毁失败
	/// \retval <0 销毁成功
	int (*getCaps)(struct VideoDecoder *thiz, VideoDecCaps *caps);


	/// 开始解码.
	/// 
	/// \param [in] thiz 视频解码接口指针
	/// \retval 0  开始成功
	/// \retval <0  开始失败
	int (*start)(struct VideoDecoder *thiz);


	/// 停止解码，当前正在进行的其他调用应立即返回。
	/// 
	/// \param [in] thiz 视频解码接口指针
	/// \retval 0  停止成功
	/// \retval <0  停止失败
	int (*stop)(struct VideoDecoder *thiz);


	/// 清空解码后图像缓冲，被阻塞的putPacket将会立即返回。
	/// 
	/// \param [in] thiz 视频解码接口指针
	/// \retval 0  清空成功
	/// \retval <0  清空失败
	int (*flush)(struct VideoDecoder *thiz);


	/// 检查解码后缓冲是否为空，即图像是否已经被全部呈现。
	/// 
	/// \param [in] thiz 视频解码接口指针
	/// \retval 0  非空
	/// \retval 1  已空
	/// \return <0 检查出错
	int (*empty)(struct VideoDecoder *thiz);


	/// 设置视频数据解码的格式。
	///
	/// \param [in] thiz 本对象指针。
	/// \param [in] format 视频解码格式VideoDecFormat指针。
	/// \retval 0  设置成功
	/// \retval <0  设置失败
	int (*setFormat)(struct VideoDecoder *thiz, VideoDecFormat* format);


	/// 填充帧数据到视频解码缓冲，非阻塞操作，如果底层缓冲已满，则返回错误。
	/// 解码后的图像不一定立即显示，底层还需要进行帧率控制，直到解码后缓冲
	/// 有足够空间，才可以填下次数据。
	/// 
	/// \param [in] thiz 视频解码接口指针
	/// \param [in] packet 包数据信息，见VideoDecPacket结构。
	/// \retval 0  写成功
	/// \retval <0  写失败
	int (*putPacket)(struct VideoDecoder *thiz, VideoDecPacket *packet);


	/// 得到视频画面的实际分辨率大小
	/// 
	/// \param [in] thiz 视频解码接口指针
	/// \param [in] size 存放分辨率。
	/// \retval 0  获取成功
	/// \retval <0  获取失败
	int (*getSize)(struct VideoDecoder *thiz, Size *size);
	
	
	/// 设置回放的时间戳，已经解码后的图像如果其时间戳小于设置的时间戳，应立即输出。
	/// 
	/// \param [in] thiz 视频解码接口指针
	/// \param [in] pts 参考时间戳。
	/// \retval 0  设置成功
	/// \retval <0  设置失败	
	int (*setPts)(struct VideoDecoder *thiz, uint64 pts);


	/// 将前一帧已经解码的数据再次压缩成图片
	/// 
	/// \param [in] thiz 视频解码接口指针
	/// \param [in] param 抓图参数
	/// \retval 0  压缩成功
	/// \retval <0  压缩失败	
	int (*snapshot)(struct VideoDecoder *thiz, VideoDecSnapshotParam*  param);
	
	
	///< 保留
	int reserved[113];
} VideoDecoder;


/// 视频解码接口描述，128字节
/// 默认解码接口和输出通道的对应关系是固定的。有解码子卡时，也允许通过Matrix
/// 的setDecodeCardMode方法选择将子卡的解码结果是直接输出到子卡还是回传到主板。
typedef struct VideoDecDesc
{
	VideoSurface *surface;	///< 解码后生成的视频表面
	int	dest;				///< 初始视频输出端口
	int card;				///< 初始视频输出子卡槽位号，0表示主板，>0表示子卡
	int	channel;		    ///< 视频解码通道号
	int reserved[28];		///< 保留
} VideoDecDesc;


/// 创建视频解码接口。创建成功后，如果芯片资源限制，不一定可以正常解码。
/// 
/// \param [in] dest 视频解码接口描述结构VideoDecDesc指针
/// \param [out] videoDecoder 视频解码接口指针的指针
/// \retval <0 创建失败
/// \retval 0 创建成功
int PAL_API createVideoDecoder(VideoDecDesc *desc, VideoDecoder **videoDecoder);


/// jpeg转rgb接口。
/// 
/// \pJpegToRgb [in,out] 待转换jpeg数据缓存
/// \retval <0 操作失败 
/// \retval 0 操作成功 
int PAL_API videoDecJpegToRgb(VideoDecTransParam* pJpegToRgb);


/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__VIDEO_DEC_API_H__

